package com.xuecheng.content.controller;

import com.xuecheng.api.content.FileManagerApi;
import com.xuecheng.common.exception.ExceptionCast;
import com.xuecheng.common.util.RandomStringUtil;
import com.xuecheng.content.common.constant.ContentErrorCode;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 通用功能 前端控制器，包括文件上传和短信
 */
@RestController
public class FileController implements FileManagerApi {

    /*
   * #文件系统微服的请求地址
       file.service.url = http://127.0.0.1:56082
       #文件存储空间名称
       file.service.bucket = xczx123-static-imgs
       #文件存储区域的地址
       file.service.upload.region = http://upload-z1.qiniu.com
       #文件访问的cdn加速域名
       cdn.domain = qsrm3mr4y.hb-bkt.clouddn.com
   *
   * */
    @Value("${file.service.url}")
    private String url;

    @Value("${file.service.bucket}")
    private String bucket;

    @Value("${file.service.upload.region}")
    private String region;

    @Value("${cdn.domain}")
    private String domain;

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 远端发送请求获得上传凭证
     *
     * @return
     */
    @GetMapping("common/qnUploadToken")
    public Map<String, Object> generateUploadToken() {

        try {
            // 发送http请求获得前端上传文件的凭证
            // 1.请求的路径地址
            String fileServiceUrl = url + "/farming/generatetoken?origin=qiniu";
            // 2.请求体中的参数Map
            HashMap<String, Object> dataMap = new HashMap<>();

         /*
        * {
              "tokenType":"1",
              "scope":"xczx123-static-imgs",
              "deadline":3600,
              "key":"111xxxeeee"
            }
        * */
            dataMap.put("tokenType", "1");
            dataMap.put("scope", bucket);
            dataMap.put("deadline", 3600);
            dataMap.put("key", UUID.randomUUID().toString() + RandomStringUtils.randomAlphanumeric(16));

            /*
             * postForEntity：发送post请求，并使用ResponseEntity来封装结果数据
             *   参数：
             *       1.请求的路径地址
             *          http的Api路径接口地址
             *       2.请求体中的参数Map
             *       3.返回的类型Map封装
             *       4.queryString的参数（可变参数）
             *
             * */
            ResponseEntity<Map> response = restTemplate.postForEntity(fileServiceUrl, dataMap, Map.class);
            Map body = response.getBody();
            Object token = body.get("result");
            // 3.返回结果数据
            dataMap.put("qnToken", token);
            dataMap.put("up_region", region);
            dataMap.put("domain", domain);
            return dataMap;
        } catch (RestClientException e) {

            // 在catch代码中不能使用e.printStackTrace
            // 获得文件上传凭证需要依赖外部服务，远端请求会失败，需要使用try/catch来接受异常信息
            ExceptionCast.cast(ContentErrorCode.E_120601);
            return null;
        }
    }
}
